home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Games / MAME / src / drivers / wc90.c < prev    next >
C/C++ Source or Header  |  2000-05-04  |  15KB  |  455 lines

  1. /*
  2. World Cup 90 ( Tecmo ) driver
  3. -----------------------------
  4.  
  5. Ernesto Corvi
  6. (ernesto@imagina.com)
  7.  
  8. TODO:
  9. - ROM ic82_06.bin (ADPCM) is not used
  10. - The second YM2203 starts outputting static after a few seconds.
  11. - Dip switches mapping is not complete. ( Anyone has the manual handy? )
  12.  
  13.  
  14. CPU #1 : Handles background & foreground tiles, controllers, dipswitches.
  15. CPU #2 : Handles sprites and palette
  16. CPU #3 : Audio.
  17.  
  18. Memory Layout:
  19.  
  20. CPU #1
  21. 0000-8000 ROM
  22. 8000-9000 RAM
  23. a000-a800 Color Ram for background #1 tiles
  24. a800-b000 Video Ram for background #1 tiles
  25. c000-c800 Color Ram for background #2 tiles
  26. c800-c000 Video Ram for background #2 tiles
  27. e000-e800 Color Ram for foreground tiles
  28. e800-f000 Video Ram for foreground tiles
  29. f800-fc00 Common Ram with CPU #2
  30. fc00-fc00 Stick 1 input port
  31. fc02-fc02 Stick 2 input port
  32. fc05-fc05 Start buttons and Coins input port
  33. fc06-fc06 Dip Switch A
  34. fc07-fc07 Dip Switch B
  35.  
  36. CPU #2
  37. 0000-c000 ROM
  38. c000-d000 RAM
  39. d000-d800 RAM Sprite Ram
  40. e000-e800 RAM Palette Ram
  41. f800-fc00 Common Ram with CPU #1
  42.  
  43. CPU #3
  44. 0000-0xc000 ROM
  45. ???????????
  46.  
  47. */
  48.  
  49. #include "driver.h"
  50. #include "vidhrdw/generic.h"
  51. #include "cpu/z80/z80.h"
  52.  
  53.  
  54. extern unsigned char *wc90_shared;
  55.  
  56. extern unsigned char *wc90_tile_colorram, *wc90_tile_videoram;
  57. extern unsigned char *wc90_tile_colorram2, *wc90_tile_videoram2;
  58.  
  59.  
  60. extern unsigned char *wc90_scroll0xlo, *wc90_scroll0xhi;
  61. extern unsigned char *wc90_scroll1xlo, *wc90_scroll1xhi;
  62. extern unsigned char *wc90_scroll2xlo, *wc90_scroll2xhi;
  63.  
  64. extern unsigned char *wc90_scroll0ylo, *wc90_scroll0yhi;
  65. extern unsigned char *wc90_scroll1ylo, *wc90_scroll1yhi;
  66. extern unsigned char *wc90_scroll2ylo, *wc90_scroll2yhi;
  67.  
  68. extern size_t wc90_tile_videoram_size;
  69. extern size_t wc90_tile_videoram_size2;
  70.  
  71. int wc90_vh_start( void );
  72. void wc90_vh_stop( void );
  73. READ_HANDLER( wc90_tile_videoram_r );
  74. WRITE_HANDLER( wc90_tile_videoram_w );
  75. READ_HANDLER( wc90_tile_colorram_r );
  76. WRITE_HANDLER( wc90_tile_colorram_w );
  77. READ_HANDLER( wc90_tile_videoram2_r );
  78. WRITE_HANDLER( wc90_tile_videoram2_w );
  79. READ_HANDLER( wc90_tile_colorram2_r );
  80. WRITE_HANDLER( wc90_tile_colorram2_w );
  81. READ_HANDLER( wc90_shared_r );
  82. WRITE_HANDLER( wc90_shared_w );
  83. void wc90_vh_screenrefresh(struct osd_bitmap *bitmap,int full_refresh);
  84.  
  85.  
  86. static WRITE_HANDLER( wc90_bankswitch_w )
  87. {
  88.     int bankaddress;
  89.     unsigned char *RAM = memory_region(REGION_CPU1);
  90.  
  91.  
  92.     bankaddress = 0x10000 + ( ( data & 0xf8 ) << 8 );
  93.     cpu_setbank( 1,&RAM[bankaddress] );
  94. }
  95.  
  96. static WRITE_HANDLER( wc90_bankswitch1_w )
  97. {
  98.     int bankaddress;
  99.     unsigned char *RAM = memory_region(REGION_CPU2);
  100.  
  101.  
  102.     bankaddress = 0x10000 + ( ( data & 0xf8 ) << 8 );
  103.     cpu_setbank( 2,&RAM[bankaddress] );
  104. }
  105.  
  106. static WRITE_HANDLER( wc90_sound_command_w )
  107. {
  108.     soundlatch_w(offset,data);
  109.     cpu_cause_interrupt(2,Z80_NMI_INT);
  110. }
  111.  
  112. static struct MemoryReadAddress wc90_readmem1[] =
  113. {
  114.     { 0x0000, 0x7fff, MRA_ROM },
  115.     { 0x8000, 0x9fff, MRA_RAM }, /* Main RAM */
  116.     { 0xa000, 0xa7ff, wc90_tile_colorram_r }, /* bg 1 color ram */
  117.     { 0xa800, 0xafff, wc90_tile_videoram_r }, /* bg 1 tile ram */
  118.     { 0xb000, 0xbfff, MRA_RAM },
  119.     { 0xc000, 0xc7ff, wc90_tile_colorram2_r }, /* bg 2 color ram */
  120.     { 0xc800, 0xcfff, wc90_tile_videoram2_r }, /* bg 2 tile ram */
  121.     { 0xd000, 0xdfff, MRA_RAM },
  122.     { 0xe000, 0xe7ff, colorram_r }, /* fg color ram */
  123.     { 0xe800, 0xefff, videoram_r }, /* fg tile ram */
  124.     { 0xf000, 0xf7ff, MRA_BANK1 },
  125.     { 0xf800, 0xfbff, wc90_shared_r },
  126.     { 0xfc00, 0xfc00, input_port_0_r }, /* Stick 1 */
  127.     { 0xfc02, 0xfc02, input_port_1_r }, /* Stick 2 */
  128.     { 0xfc05, 0xfc05, input_port_4_r }, /* Start & Coin */
  129.     { 0xfc06, 0xfc06, input_port_2_r }, /* DIP Switch A */
  130.     { 0xfc07, 0xfc07, input_port_3_r }, /* DIP Switch B */
  131.     { -1 }    /* end of table */
  132. };
  133.  
  134. static struct MemoryReadAddress wc90_readmem2[] =
  135. {
  136.     { 0x0000, 0xbfff, MRA_ROM },
  137.     { 0xc000, 0xcfff, MRA_RAM },
  138.     { 0xd000, 0xd7ff, MRA_RAM },
  139.     { 0xd800, 0xdfff, MRA_RAM },
  140.     { 0xe000, 0xe7ff, MRA_RAM },
  141.     { 0xf000, 0xf7ff, MRA_BANK2 },
  142.     { 0xf800, 0xfbff, wc90_shared_r },
  143.     { -1 }    /* end of table */
  144. };
  145.  
  146. static struct MemoryWriteAddress wc90_writemem1[] =
  147. {
  148.     { 0x0000, 0x7fff, MWA_ROM },
  149.     { 0x8000, 0x9fff, MWA_RAM },
  150.     { 0xa000, 0xa7ff, wc90_tile_colorram_w, &wc90_tile_colorram },
  151.     { 0xa800, 0xafff, wc90_tile_videoram_w, &wc90_tile_videoram, &wc90_tile_videoram_size },
  152.     { 0xb000, 0xbfff, MWA_RAM },
  153.     { 0xc000, 0xc7ff, wc90_tile_colorram2_w, &wc90_tile_colorram2 },
  154.     { 0xc800, 0xcfff, wc90_tile_videoram2_w, &wc90_tile_videoram2, &wc90_tile_videoram_size2 },
  155.     { 0xd000, 0xdfff, MWA_RAM },
  156.     { 0xe000, 0xe7ff, colorram_w, &colorram },
  157.     { 0xe800, 0xefff, videoram_w, &videoram, &videoram_size },
  158.     { 0xf000, 0xf7ff, MWA_ROM },
  159.     { 0xf800, 0xfbff, wc90_shared_w, &wc90_shared },
  160.     { 0xfc02, 0xfc02, MWA_RAM, &wc90_scroll0ylo },
  161.     { 0xfc03, 0xfc03, MWA_RAM, &wc90_scroll0yhi },
  162.     { 0xfc06, 0xfc06, MWA_RAM, &wc90_scroll0xlo },
  163.     { 0xfc07, 0xfc07, MWA_RAM, &wc90_scroll0xhi },
  164.     { 0xfc22, 0xfc22, MWA_RAM, &wc90_scroll1ylo },
  165.     { 0xfc23, 0xfc23, MWA_RAM, &wc90_scroll1yhi },
  166.     { 0xfc26, 0xfc26, MWA_RAM, &wc90_scroll1xlo },
  167.     { 0xfc27, 0xfc27, MWA_RAM, &wc90_scroll1xhi },
  168.     { 0xfc42, 0xfc42, MWA_RAM, &wc90_scroll2ylo },
  169.     { 0xfc43, 0xfc43, MWA_RAM, &wc90_scroll2yhi },
  170.     { 0xfc46, 0xfc46, MWA_RAM, &wc90_scroll2xlo },
  171.     { 0xfc47, 0xfc47, MWA_RAM, &wc90_scroll2xhi },
  172.     { 0xfcc0, 0xfcc0, wc90_sound_command_w },
  173.     { 0xfcd0, 0xfcd0, MWA_NOP },    /* ??? */
  174.     { 0xfce0, 0xfce0, wc90_bankswitch_w },
  175.     { -1 }    /* end of table */
  176. };
  177.  
  178. static struct MemoryWriteAddress wc90_writemem2[] =
  179. {
  180.     { 0x0000, 0xbfff, MWA_ROM },
  181.     { 0xc000, 0xcfff, MWA_RAM },
  182.     { 0xd000, 0xd7ff, MWA_RAM, &spriteram, &spriteram_size },
  183.     { 0xd800, 0xdfff, MWA_RAM },
  184.     { 0xe000, 0xe7ff, paletteram_xxxxBBBBRRRRGGGG_swap_w, &paletteram },
  185.     { 0xf000, 0xf7ff, MWA_ROM },
  186.     { 0xf800, 0xfbff, wc90_shared_w },
  187.     { 0xfc00, 0xfc00, wc90_bankswitch1_w },
  188.     { 0xfc01, 0xfc01, MWA_NOP },    /* ??? */
  189.     { -1 }    /* end of table */
  190. };
  191.  
  192. static struct MemoryReadAddress sound_readmem[] =
  193. {
  194.     { 0x0000, 0xbfff, MRA_ROM },
  195.     { 0xf000, 0xf7ff, MRA_RAM },
  196.     { 0xf800, 0xf800, YM2203_status_port_0_r },
  197.     { 0xf801, 0xf801, YM2203_read_port_0_r },
  198.     { 0xf802, 0xf802, YM2203_status_port_1_r },
  199.     { 0xf803, 0xf803, YM2203_read_port_1_r },
  200.     { 0xfc00, 0xfc00, MRA_NOP }, /* ??? adpcm ??? */
  201.     { 0xfc10, 0xfc10, soundlatch_r },
  202.     { -1 }    /* end of table */
  203. };
  204.  
  205. static struct MemoryWriteAddress sound_writemem[] =
  206. {
  207.     { 0x0000, 0xbfff, MWA_ROM },
  208.     { 0xf000, 0xf7ff, MWA_RAM },
  209.     { 0xf800, 0xf800, YM2203_control_port_0_w },
  210.     { 0xf801, 0xf801, YM2203_write_port_0_w },
  211.     { 0xf802, 0xf802, YM2203_control_port_1_w },
  212.     { 0xf803, 0xf803, YM2203_write_port_1_w },
  213.     { -1 }    /* end of table */
  214. };
  215.  
  216. INPUT_PORTS_START( wc90 )
  217.     PORT_START    /* IN0 bit 0-5 */
  218.     PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP | IPF_8WAY )
  219.     PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN | IPF_8WAY )
  220.     PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT | IPF_8WAY )
  221.     PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_8WAY )
  222.     PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 )
  223.     PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 )
  224.     PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
  225.     PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
  226.  
  227.     PORT_START    /* IN1 bit 0-5 */
  228.     PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP | IPF_8WAY | IPF_PLAYER2 )
  229.     PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN | IPF_8WAY | IPF_PLAYER2 )
  230.     PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT | IPF_8WAY | IPF_PLAYER2 )
  231.     PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_8WAY | IPF_PLAYER2 )
  232.     PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 | IPF_PLAYER2 )
  233.     PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 | IPF_PLAYER2 )
  234.     PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
  235.     PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
  236.  
  237.     PORT_START    /* DSWA */
  238.     PORT_DIPNAME( 0x0f, 0x0f, DEF_STR( Coinage ) )
  239.     PORT_DIPSETTING(    0x00, "10 Coins/1 Credit" )
  240.     PORT_DIPSETTING(    0x08, DEF_STR( 9C_1C ) )
  241.     PORT_DIPSETTING(    0x04, DEF_STR( 8C_1C ) )
  242.     PORT_DIPSETTING(    0x0c, DEF_STR( 7C_1C ) )
  243.     PORT_DIPSETTING(    0x02, DEF_STR( 6C_1C ) )
  244.     PORT_DIPSETTING(    0x0a, DEF_STR( 5C_1C ) )
  245.     PORT_DIPSETTING(    0x06, DEF_STR( 4C_1C ) )
  246.     PORT_DIPSETTING(    0x0e, DEF_STR( 3C_1C ) )
  247.     PORT_DIPSETTING(    0x09, DEF_STR( 2C_1C ) )
  248.     PORT_DIPSETTING(    0x0f, DEF_STR( 1C_1C ) )
  249.     PORT_DIPSETTING(    0x01, DEF_STR( 2C_3C ) )
  250.     PORT_DIPSETTING(    0x07, DEF_STR( 1C_2C ) )
  251.     PORT_DIPSETTING(    0x0b, DEF_STR( 1C_3C ) )
  252.     PORT_DIPSETTING(    0x03, DEF_STR( 1C_4C ) )
  253.     PORT_DIPSETTING(    0x0d, DEF_STR( 1C_5C ) )
  254.     PORT_DIPSETTING(    0x05, DEF_STR( 1C_6C ) )
  255.     PORT_DIPNAME( 0x30, 0x30, DEF_STR( Difficulty ) )
  256.     PORT_DIPSETTING(    0x30, "Easy" )
  257.     PORT_DIPSETTING(    0x10, "Normal" )
  258.     PORT_DIPSETTING(    0x20, "Hard" )
  259.     PORT_DIPSETTING(    0x00, "Hardest" )
  260.     PORT_DIPNAME( 0x40, 0x40, "Countdown Speed" )
  261.     PORT_DIPSETTING(    0x40, "Normal" )
  262.     PORT_DIPSETTING(    0x00, "Fast" )
  263.     PORT_DIPNAME( 0x80, 0x80, DEF_STR( Demo_Sounds ) )
  264.     PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
  265.     PORT_DIPSETTING(    0x80, DEF_STR( On ) )
  266.  
  267.     PORT_START    /* DSWB */
  268.     PORT_DIPNAME( 0x03, 0x03, "1 Player Game Time" )
  269.     PORT_DIPSETTING(    0x01, "1:00" )
  270.     PORT_DIPSETTING(    0x02, "1:30" )
  271.     PORT_DIPSETTING(    0x03, "2:00" )
  272.     PORT_DIPSETTING(    0x00, "2:30" )
  273.     PORT_DIPNAME( 0x1c, 0x1c, "2 Players Game Time" )
  274.     PORT_DIPSETTING(    0x0c, "1:00" )
  275.     PORT_DIPSETTING(    0x14, "1:30" )
  276.     PORT_DIPSETTING(    0x04, "2:00" )
  277.     PORT_DIPSETTING(    0x18, "2:30" )
  278.     PORT_DIPSETTING(    0x1c, "3:00" )
  279.     PORT_DIPSETTING(    0x08, "3:30" )
  280.     PORT_DIPSETTING(    0x10, "4:00" )
  281.     PORT_DIPSETTING(    0x00, "5:00" )
  282.     PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
  283.     PORT_DIPSETTING(    0x20, DEF_STR( Off ) )
  284.     PORT_DIPSETTING(    0x00, DEF_STR( On ) )
  285.     PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
  286.     PORT_DIPSETTING(    0x40, DEF_STR( Off ) )
  287.     PORT_DIPSETTING(    0x00, DEF_STR( On ) )
  288.     PORT_DIPNAME( 0x80, 0x00, "Language" )
  289.     PORT_DIPSETTING(    0x00, "English" )
  290.     PORT_DIPSETTING(    0x80, "Japanese" )
  291.  
  292.     PORT_START    /* IN2 bit 0-3 */
  293.     PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 )
  294.     PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_COIN2 )
  295.     PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_START1 )
  296.     PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_START2 )
  297. INPUT_PORTS_END
  298.  
  299.  
  300.  
  301. static struct GfxLayout charlayout =
  302. {
  303.     8,8,    /* 8*8 characters */
  304.     2048,    /* 1024 characters */
  305.     4,    /* 8 bits per pixel */
  306.     { 0, 1, 2, 3 },    /* the bitplanes are packed in one nibble */
  307.     { 0*4, 1*4, 2*4, 3*4, 4*4, 5*4, 6*4, 7*4 },
  308.     { 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32 },
  309.     32*8    /* every char takes 32 consecutive bytes */
  310. };
  311.  
  312. static struct GfxLayout tilelayout =
  313. {
  314.     16,16,    /* 16*16 sprites */
  315.     2048,    /* 2048 tiles */
  316.     4,    /* 4 bits per pixel */
  317.     { 0, 1, 2, 3 },    /* the bitplanes are packed in one nibble */
  318.     { 0*4, 1*4, 2*4, 3*4, 4*4, 5*4, 6*4, 7*4,
  319.             32*8+0*4, 32*8+1*4, 32*8+2*4, 32*8+3*4, 32*8+4*4, 32*8+5*4, 32*8+6*4, 32*8+7*4 },
  320.     { 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32,
  321.             16*32, 17*32, 18*32, 19*32, 20*32, 21*32, 22*32, 23*32 },
  322.     128*8    /* every sprite takes 128 consecutive bytes */
  323. };
  324.  
  325. static struct GfxLayout spritelayout =
  326. {
  327.     16,16,    /* 16*16 sprites */
  328.     4096,    /* 1024 sprites */
  329.     4,    /* 4 bits per pixel */
  330.     { 0, 1, 2, 3 },    /* the bitplanes are packed in one nibble */
  331.     { 0*4, 1*4, 1024*256*8+0*4, 1024*256*8+1*4, 2*4, 3*4, 1024*256*8+2*4, 1024*256*8+3*4,
  332.             16*8+0*4, 16*8+1*4, 1024*256*8+16*8+0*4, 1024*256*8+16*8+1*4, 16*8+2*4, 16*8+3*4, 1024*256*8+16*8+2*4, 1024*256*8+16*8+3*4 },
  333.     { 0*16, 1*16, 2*16, 3*16, 4*16, 5*16, 6*16, 7*16,
  334.             16*16, 17*16, 18*16, 19*16, 20*16, 21*16, 22*16, 23*16 },
  335.     64*8    /* every sprite takes 128 consecutive bytes */
  336. };
  337.  
  338. static struct GfxDecodeInfo gfxdecodeinfo[] =
  339. {
  340.     { REGION_GFX1, 0x00000, &charlayout,          1*16*16, 16*16 },
  341.     { REGION_GFX2, 0x00000, &tilelayout,            2*16*16, 16*16 },
  342.     { REGION_GFX3, 0x00000, &tilelayout,            3*16*16, 16*16 },
  343.     { REGION_GFX4, 0x00000, &spritelayout,        0*16*16, 16*16 }, // sprites
  344.     { -1 } /* end of array */
  345. };
  346.  
  347.  
  348.  
  349. /* handler called by the 2203 emulator when the internal timers cause an IRQ */
  350. static void irqhandler(int irq)
  351. {
  352.     cpu_set_irq_line(2,0,irq ? ASSERT_LINE : CLEAR_LINE);
  353. }
  354.  
  355. static struct YM2203interface ym2203_interface =
  356. {
  357.     2,            /* 2 chips */
  358.     6000000,    /* 6 MHz ????? seems awfully fast, I don't even know if the */
  359.                 /*  YM2203 can go at that speed */
  360.     { YM2203_VOL(25,25), YM2203_VOL(25,25) },
  361.     { 0 },
  362.     { 0 },
  363.     { 0 },
  364.     { 0 },
  365.     { irqhandler }
  366. };
  367.  
  368. static struct MachineDriver machine_driver_wc90 =
  369. {
  370.     /* basic machine hardware */
  371.     {
  372.         {
  373.             CPU_Z80,
  374.             6000000,    /* 6.0 Mhz ??? */
  375.             wc90_readmem1, wc90_writemem1,0,0,
  376.             interrupt,1
  377.         },
  378.         {
  379.             CPU_Z80,
  380.             6000000,    /* 6.0 Mhz ??? */
  381.             wc90_readmem2, wc90_writemem2,0,0,
  382.             interrupt,1
  383.         },
  384.         {
  385.             CPU_Z80 | CPU_AUDIO_CPU,
  386.             4000000,    /* 4 MHz ???? */
  387.             sound_readmem,sound_writemem,0,0,
  388.             ignore_interrupt,0    /* IRQs are triggered by the YM2203 */
  389.                                 /* NMIs are triggered by the main CPU */
  390.         }
  391.     },
  392.     60, DEFAULT_60HZ_VBLANK_DURATION,    /* frames per second, vblank duration */
  393.     1,    /* 1 CPU slice per frame - interleaving is forced when a sound command is written */
  394.     0,
  395.  
  396.     /* video hardware */
  397.     32*8, 32*8, { 0*8, 32*8-1, 2*8, 30*8-1 },
  398.     gfxdecodeinfo,
  399.     4*16*16, 4*16*16,
  400.     0,
  401.  
  402.     VIDEO_TYPE_RASTER | VIDEO_MODIFIES_PALETTE,
  403.     0,
  404.     wc90_vh_start,
  405.     wc90_vh_stop,
  406.     wc90_vh_screenrefresh,
  407.  
  408.     /* sound hardware */
  409.     0,0,0,0,
  410.     {
  411.         {
  412.             SOUND_YM2203,
  413.             &ym2203_interface
  414.         }
  415.     }
  416. };
  417.  
  418.  
  419.  
  420. ROM_START( wc90 )
  421.     ROM_REGION( 0x20000, REGION_CPU1 )    /* 128k for code */
  422.     ROM_LOAD( "ic87_01.bin",  0x00000, 0x08000, 0x4a1affbc )    /* c000-ffff is not used */
  423.     ROM_LOAD( "ic95_02.bin",  0x10000, 0x10000, 0x847d439c )    /* banked at f000-f7ff */
  424.  
  425.     ROM_REGION( 0x20000, REGION_CPU2 )    /* 96k for code */  /* Second CPU */
  426.     ROM_LOAD( "ic67_04.bin",  0x00000, 0x10000, 0xdc6eaf00 )    /* c000-ffff is not used */
  427.     ROM_LOAD( "ic56_03.bin",  0x10000, 0x10000, 0x1ac02b3b )    /* banked at f000-f7ff */
  428.  
  429.     ROM_REGION( 0x10000, REGION_CPU3 )    /* 64k for the audio CPU */
  430.     ROM_LOAD( "ic54_05.bin",  0x00000, 0x10000, 0x27c348b3 )
  431.  
  432.     ROM_REGION( 0x010000, REGION_GFX1 | REGIONFLAG_DISPOSE )
  433.     ROM_LOAD( "ic85_07v.bin", 0x00000, 0x10000, 0xc5219426 )    /* characters */
  434.  
  435.     ROM_REGION( 0x040000, REGION_GFX2 | REGIONFLAG_DISPOSE )
  436.     ROM_LOAD( "ic86_08v.bin", 0x00000, 0x20000, 0x8fa1a1ff )    /* tiles #1 */
  437.     ROM_LOAD( "ic90_09v.bin", 0x20000, 0x20000, 0x99f8841c )    /* tiles #2 */
  438.  
  439.     ROM_REGION( 0x040000, REGION_GFX3 | REGIONFLAG_DISPOSE )
  440.     ROM_LOAD( "ic87_10v.bin", 0x00000, 0x20000, 0x8232093d )    /* tiles #3 */
  441.     ROM_LOAD( "ic91_11v.bin", 0x20000, 0x20000, 0x188d3789 )    /* tiles #4 */
  442.  
  443.     ROM_REGION( 0x080000, REGION_GFX4 | REGIONFLAG_DISPOSE )
  444.     ROM_LOAD( "ic50_12v.bin", 0x00000, 0x20000, 0xda1fe922 )    /* sprites  */
  445.     ROM_LOAD( "ic54_13v.bin", 0x20000, 0x20000, 0x9ad03c2c )    /* sprites  */
  446.     ROM_LOAD( "ic60_14v.bin", 0x40000, 0x20000, 0x499dfb1b )    /* sprites  */
  447.     ROM_LOAD( "ic65_15v.bin", 0x60000, 0x20000, 0xd8ea5c81 )    /* sprites  */
  448.  
  449.     ROM_REGION( 0x20000, REGION_SOUND1 )    /* 64k for ADPCM samples */
  450.     ROM_LOAD( "ic82_06.bin",  0x00000, 0x20000, 0x2fd692ed )
  451. ROM_END
  452.  
  453.  
  454. GAMEX( 1989, wc90, 0, wc90, wc90, 0, ROT0, "Tecmo", "World Cup 90", GAME_IMPERFECT_SOUND | GAME_NO_COCKTAIL )
  455.